<?php

namespace humhub\modules\api\controllers;

use humhub\modules\api\models\Scores;
use humhub\modules\api\models\Tag;
use humhub\modules\api\models\UserTag;
use Yii;
use yii\helpers\Url;
use yii\web\HttpException;
use humhub\modules\user\models\User;
use humhub\modules\api\models\Profile;
use humhub\modules\api\models\Invite;
use humhub\modules\api\models\RealName;
use humhub\modules\api\models\FileAli;

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBearerAuth;

/**
 * 获取个人Profile资料, 编辑个人Profile资料、头像、Banner图、修改密码、新增获取实名认证资料、签到积分
 */
class AccountController extends BaseAccountController
{

    /**
     * @inheritdoc
     */
    public function behaviors(){
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => CompositeAuth::className(),
            'authMethods' => [
                //QueryParamAuth::className(),
                HttpBearerAuth::className(),
            ],
        ];

        $behaviors['acl'] = [
            'class' => \humhub\components\behaviors\AccessControl::className(),
        ];

        return $behaviors;
    }

    /**
     * 获取个人所有Profile信息
     *
     * GET /api/account/edit
     *
     * @return array 所有个人Profile信息(Firstname, Gender, Phone, Facebok, 等......新增: u_v是否+V=1/0, u_real是否实名=1/0, u_score我的积分=number, tags个人标签,sign:1 已签到 0 未签到)
     */
    public function actionEdit(){
        $uid = Yii::$app->user->id;
        $go=User::findOne(['id'=>$uid]);

        if($go->g_name==''){
                $go->g_name=$this->getName();
                $go->g_url='http://www.uni-class.com/img/head/'.rand(1,9).'.png';
                $go->save(false);
        }

        $user = User::find()
            ->select(['id', 'username', 'guid', 'u_v', 'u_real', 'u_score', 'last_sign','sign_count' ,'g_name', 'g_url'])
            ->innerJoinWith('profile', 'profile.user_id=user.id')
            //->leftJoin('group_user', 'group_user.user_id=user.id, group_user.group_id=')
            ->where(['user.id' => $uid])
            ->asArray()
            ->one();

        $time2=$user['last_sign'];
        $time1 = time();
        $t1=date('Y-m-d',$time1);
        $t2=date('Y-m-d',$time2);
        $t11=strtotime($t1);$t22=strtotime($t2);

        $diff = (int)(($t11-$t22)/(24*3600));

        if ($diff<=0 && $diff>-10000){
            $sign=1;
        }else{
            $sign=0;
        }
        $user['is_sign']=$sign;

        $tag=UserTag::find()->select('tag_id')->where(['user_id'=>$uid])->asArray()->all();
        if($tag){
            foreach ($tag as $item){
                $tid=$item['tag_id'];
                $tags[]=Tag::findOne($tid)->name;
            }
            $tags=implode(',',$tags);
            $user['tags']=$tags;
        }

        if( ! is_array($user) ) $user = [];
        return $user;
        //$user = Yii::$app->user->getIdentity();
        //$user->profile->scenario = 'editProfile';
    }

    /**
     * 个人签到增加积分
     *
     * GET /api/account/signed
     *
     * @return boolean
     */
    public function actionSigned(){
        $user=User::findOne(Yii::$app->user->id);
        $time2=$user['last_sign'];
        $time1 = time();
        $t1=date('Y-m-d',$time1);
        $t2=date('Y-m-d',$time2);
        $t11=strtotime($t1);$t22=strtotime($t2);

        $diff = (int)(($t11-$t22)/(24*3600));

        if ($diff<=0 && $diff>-10000){
            throw new \yii\web\BadRequestHttpException('您已签到');
        }
        if ($diff>1){
            $sign=1;
        }else{
            $sign=0;
        }

        $scores=new Scores();
        $scores->setScores('签到成功',1,'',1,$sign);
        return $scores;
    }

    /**
     * 保存个人所有Profile信息
     *
     * POST /api/account/edit-save
     *
     * post.参数 参考/api/account/edit返回的[Profile]中的属性信息,可以仅传参需要修改的信息
     *
     * post.gender 可选值: male, female, custom
     *
     * @return boolean 新增返回:data.fd表示实际有效传参数, data.up表示实际更新数
     */
    public function actionEditSave(){
        $request = Yii::$app->request;
        if( ! $request->isPost )
            throw new HttpException(500, 'Invalid method.');
        if( ! Yii::$app->user->id )
            throw new HttpException(403, 'Access denied.');
        $id = Yii::$app->user->id;

        //$model = new Profile;
        if( ($model = Profile::findOne($id) ) === null ){
            throw new HttpException(403, 'Access denied.');
        }

        $tables = $model->getTableSchema();
        $fields = (array)$tables->columns;
        unset($fields['user_id']);
        $set_num = 0;
        $set_set = 0;
        foreach($fields AS $key=>$val){
            if( Yii::$app->request->post($key) !== NULL ){
                $set_num++;
                if( Yii::$app->request->post($key) != $model->$key ){
                    $set_set++;
                }
            }
        }
        if( ! $set_set ){
            return ['fd'=>$set_num, 'up'=>0];
        }

        if( $model->load(['Profile' => Yii::$app->request->post()]) && $model->validate() && $model->save() ){
            return ['fd'=>$set_num, 'up'=>$set_set];
        }else{
            Yii::$app->params['res-success'] = false;
            return $model->getErrors();
        }
    }

    /**
     * 修改密码
     *
     * POST /api/account/change-password
     *
     * post.Password[currentPassword]    旧密码
     *
     * post.Password[newPasswordConfirm] 新密码
     *
     * post.Password[newPassword]        新密码
     *
     * @return array 如果失败data包含错误原因,需遍历data显示对应的错误
     */
    public function actionChangePassword(){
        if( ! Yii::$app->user->canChangePassword() ){
            throw new HttpException(500, 'Password change is not allowed');
        }

        $userPassword = new \humhub\modules\user\models\Password();
        $userPassword->scenario = 'changePassword';

        if ($userPassword->load(Yii::$app->request->post()) && $userPassword->validate()) {
            $userPassword->user_id = Yii::$app->user->id;
            $userPassword->setPassword($userPassword->newPassword);
            $userPassword->save();
            return true;
        }

        Yii::$app->params['res-success'] = false;
        return $userPassword->getErrors();
    }

    /**
     * 修改昵称
     *
     * POST /api/account/change-username
     *
     * post.username 新昵称
     *
     * @return array 如果失败data包含错误原因,需遍历data显示对应的错误
     */
    public function actionChangeUsername(){
        if( ! Yii::$app->user->canChangePassword() ){
            throw new HttpException(500, '修改失败.');
        }

        $user = User::findOne(Yii::$app->user->id);
        $user->scenario = 'registration';
        if ($user->load(['User' => Yii::$app->request->post()]) && $user->validate()) {
            if ($user->save()) {
                return true;
            }
        }
        Yii::$app->params['res-success'] = false;
        return $user->getErrors();
    }

    /**
     * 裁剪当前Banner图
     *
     * POST /api/account/crop-banner-image
     *
     * post.CropProfileImage[cropH]  高
     *
     * post.CropProfileImage[cropW]  宽
     *
     * post.CropProfileImage[cropX]  坐标X
     *
     * post.CropProfileImage[cropY]  坐标Y
     */
    public function actionCropBannerImage(){
        $model = new \humhub\models\forms\CropProfileImage();
        $profileImage = new \humhub\libs\ProfileBannerImage($this->getUser()->guid);

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $profileImage->cropOriginal($model->cropX, $model->cropY, $model->cropH, $model->cropW);
            return true;
        }
        throw new \yii\web\BadRequestHttpException('保存失败');
    }

    /**
     * 上传个人Banner图
     *
     * POST /api/account/banner-image-upload
     *
     * post.bannerfiles[]  Banner图文件
     *
     * return.url 上传的图片访问URL
     */
    public function actionBannerImageUpload(){
        $model = new \humhub\models\forms\UploadProfileImage();
        $json = array();

        $files = \yii\web\UploadedFile::getInstancesByName('bannerfiles');
        if( ! isset($files[0]) ){
            throw new \yii\web\BadRequestHttpException('没有上传文件');
        }
        $file = $files[0];
        $model->image = $file;

        if ($model->validate()) {
            $profileImage = new \humhub\libs\ProfileBannerImage($this->getUser()->guid);
            $profileImage->setNew($model->image);

            $json['url'] = $profileImage->getUrl();
        } else {
            //$model->getErrors()
            throw new \yii\web\BadRequestHttpException('上传文件失败');
        }
        return $json;
        //return ['files' => $json];
    }

    /**
     * 上传个人头像
     *
     * POST /api/account/profile-image-upload
     *
     * post.profilefiles[]  头像文件
     *
     * return.url 上传的图片访问URL
     */
    public function actionProfileImageUpload(){
        $model = new \humhub\models\forms\UploadProfileImage();

        $json = array();

        $files = \yii\web\UploadedFile::getInstancesByName('profilefiles');
        if( ! isset($files[0]) ){
            throw new \yii\web\BadRequestHttpException('没有上传文件');
        }
        $file = $files[0];
        $model->image = $file;

        if ($model->validate()) {
            //up oss

            $profileImage = new \humhub\libs\ProfileImage($this->getUser()->guid);
            //$profileImage->setNew($model->image);
            //$json['url'] = $profileImage->getUrl();
            //$json['size'] = $model->image->size;

            $f = $this->handleFileUpload($file, null, 'cover');
            if( $f !== false ){
                //$json['url'] = $f['url'];
                $json['url'] = $profileImage->getUrl();
            }

        } else {
            //$model->getErrors()
            throw new \yii\web\BadRequestHttpException('上传文件失败');
        }
        return $json;
    }
    protected function handleFileUpload($cFile, $object = null, $safe=0){
        $output = array();

        $file = FileAli::findOne(['guid' => $this->getUser()->guid]);
        if( ! $file ){
            $file = new FileAli();
            $file->guid = $this->getUser()->guid;
        }
        $file->setUploadedFile($cFile);

        if ($object != null) {
            $file->object_id = $object->getPrimaryKey();
            $file->object_model = $object->className();
        }

        if ( ! $file->validate() ) {
            return false;
        }
        if( ($ossurl = $file->oss_up($safe)) === false ){
            return false;
        }
        $file->ossurl = $ossurl;

        if ( $file->save()) {
            $output['error'] = false;
            $output['guid'] = $file->guid;
            $output['name'] = $file->file_name;
            $output['title'] = $file->title;
            $output['size'] = $file->size;
            $output['mimeIcon'] = \humhub\libs\MimeHelper::getMimeIconClassByExtension($file->getExtension());
            $output['mimeBaseType'] = $file->getMimeBaseType();
            $output['mimeSubType'] = $file->getMimeSubType();
            $output['url'] = $file->getUrl("", false);
            $output['thumbnailUrl'] = $file->getPreviewImageUrl(300, 300);
        } else {
            $output['error'] = true;
            $output['errors'] = $file->getErrors();
        }

        $output['name'] = $file->file_name;
        $output['size'] = $file->size;
        $output['deleteUrl'] = "";
        $output['deleteType'] = "";
        $output['thumbnailUrl'] = "";

        return $output;
    }


    /**
     * 裁剪当前头像
     *
     * POST /api/account/crop-profile-image
     *
     * post.CropProfileImage[cropH]  高
     *
     * post.CropProfileImage[cropW]  宽
     *
     * post.CropProfileImage[cropX]  坐标X
     *
     * post.CropProfileImage[cropY]  坐标Y
     */
    public function actionCropProfileImage(){
        $model = new \humhub\models\forms\CropProfileImage();
        $profileImage = new \humhub\libs\ProfileImage($this->getUser()->guid);

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $profileImage->cropOriginal($model->cropX, $model->cropY, $model->cropH, $model->cropW);
            return true;
        }
        throw new \yii\web\BadRequestHttpException('保存失败');
    }

    /**
     * @inheritdoc
     */
    public function getUser(){
        if (Yii::$app->request->get('userGuid') != '' && Yii::$app->user->getIdentity()->isSystemAdmin()) {
            $user = User::findOne(['guid' => Yii::$app->request->get('userGuid')]);
            if ($user === null) {
                throw new HttpException(404, 'Could not find user!');
            }
            return $user;
        }

        return Yii::$app->user->getIdentity();
    }

    /**
     * 实名认证(需要验证码)
     *
     * POST /api/account/ctoken
     *
     * post.mphone 手机号
     *
     * post.token 验证码
     *
     * post.realname 真实姓名
     *
     * post.idcard 身份证号
     *
     * post.img1 身份证正面照
     *
     * post.img2 身份证反面照
     *
     * 新增：
     * - post.school 学校
     * - post.major  专业
     * - post.stime  入学时间（格式为：2017-09)
     * - post.degree 学历，可选项为：（初中, 高中, 大专，大学本科, 硕士研究生, 博士研究生）
     *
     * @return boolean
     */
    public function actionCtoken(){
        $token = Yii::$app->request->post('token');
        $scores=new Scores();
        if( ! is_numeric($token) ){
            throw new \yii\web\BadRequestHttpException('手机号或验证码无效');
        }

        $phone = Yii::$app->request->post('mphone');
        $userInvite = Invite::findOne(['email'=>$phone]);
        if( $userInvite ){
            //限制校验次数
            if( $userInvite->cklimit >= 5 ){
                throw new \yii\web\BadRequestHttpException('操作过于频繁，请稍后再试.');
            }
            if( $userInvite->token==$token ){
                $uid = Yii::$app->user->id;
                //up idcard
                $model = RealName::findOne($uid);
                if( $model ){
                    if( $model->status == 0 ){
                        throw new \yii\web\BadRequestHttpException('实名认证审核中');
                    }
                    if( $model->status == 1 ){
                        throw new \yii\web\BadRequestHttpException('实名认证已通过');
                    }
                }else{
                    $model = new RealName();
                }
                if( $model->load(['RealName' => Yii::$app->request->post()]) && $model->validate() ){
                    $model->user_id = $uid;
                    $model->idcard=time();
                    $model->status  = 1; //直接通过

                    //增加积分
                    $scores->setScores('完善资料',5);
                    if( $model->save() ){
                        //更改状态
                        $user = User::findOne(Yii::$app->user->id);
                        $user->scenario = 'editInfo';
                        $user->u_real = 1;
                        $user->save();

                        return (object)[];
                        return true;
                    }
                }
                Yii::$app->params['res-success'] = false;
                return false;
            }else{
                //$userInvite->cklimit += 1; // !!! 无并发能力
                $userInvite->cklimit = new \yii\db\Expression('COALESCE(cklimit, 0) + 1');
                $userInvite->update();
                throw new \yii\web\BadRequestHttpException('手机号或验证码无效');
            }
        }
        throw new \yii\web\BadRequestHttpException('手机号或验证码无效');
    }

    /**
     * 获取个人实名认证资料
     *
     * GET /api/account/user-data
     *
     * @return array realname,school,major,degree,stime(入学年份)
     */
    public function actionUserData(){
        $uid=Yii::$app->user->id;
        if(!$uid){
            throw new \yii\web\BadRequestHttpException('无法获得当前用户信息');
        }
        $r_data=RealName::findOne(['created_by'=>$uid]);
        if($r_data){
            return [
                'realname'=>$r_data->realname,
                'school'=>$r_data->school,
                'major' =>$r_data->major,
                'stime' =>$r_data->stime,
                'degree'=>$r_data->degree
            ];
        }else{
            throw new \yii\web\BadRequestHttpException('未实名认证');
        }


    }
    //生成用户名称
    private function getName(){
        $tou=array('快乐的','冷静的','醉熏的','潇洒的','糊涂的','积极的','冷酷的','深情的','粗暴的','温柔的','可爱的','愉快的','义气的','认真的','威武的','帅气的','传统的','潇洒的','漂亮的','自然的','专一的','听话的','昏睡的','狂野的','等待的','搞怪的','幽默的','魁梧的','活泼的','开心的','高兴的','超帅的','留胡子的','坦率的','直率的','轻松的','痴情的','完美的','精明的','无聊的','有魅力的','丰富的','繁荣的','饱满的','炙热的','暴躁的','碧蓝的','俊逸的','英勇的','健忘的','故意的','无心的','土豪的','朴实的','兴奋的','幸福的','淡定的','不安的','阔达的','孤独的','独特的','疯狂的','时尚的','落后的','风趣的','忧伤的','大胆的','爱笑的','矮小的','健康的','合适的','玩命的','沉默的','斯文的','香蕉','苹果','鲤鱼','鳗鱼','任性的','细心的','粗心的','大意的','甜甜的','酷酷的','健壮的','英俊的','霸气的','阳光的','默默的','大力的','孝顺的','忧虑的','着急的','紧张的','善良的','凶狠的','害怕的','重要的','危机的','欢喜的','欣慰的','满意的','跳跃的','诚心的','称心的','如意的','怡然的','娇气的','无奈的','无语的','激动的','愤怒的','美好的','感动的','激情的','激昂的','震动的','虚拟的','超级的','寒冷的','精明的','明理的','犹豫的','忧郁的','寂寞的','奋斗的','勤奋的','现代的','过时的','稳重的','热情的','含蓄的','开放的','无辜的','多情的','纯真的','拉长的','热心的','从容的','体贴的','风中的','曾经的','追寻的','儒雅的','优雅的','开朗的','外向的','内向的','清爽的','文艺的','长情的','平常的','单身的','伶俐的','高大的','懦弱的','柔弱的','爱笑的','乐观的','耍酷的','酷炫的','神勇的','年轻的','唠叨的','瘦瘦的','无情的','包容的','顺心的','畅快的','舒适的','靓丽的','负责的','背后的','简单的','谦让的','彩色的','缥缈的','欢呼的','生动的','复杂的','慈祥的','仁爱的','魔幻的','虚幻的','淡然的','受伤的','雪白的','高高的','糟糕的','顺利的','闪闪的','羞涩的','缓慢的','迅速的','优秀的','聪明的','含糊的','俏皮的','淡淡的','坚强的','平淡的','欣喜的','能干的','灵巧的','友好的','机智的','机灵的','正直的','谨慎的','俭朴的','殷勤的','虚心的','辛勤的','自觉的','无私的','无限的','踏实的','老实的','现实的','可靠的','务实的','拼搏的','个性的','粗犷的','活力的','成就的','勤劳的','单纯的','落寞的','朴素的','悲凉的','忧心的','洁净的','清秀的','自由的','小巧的','单薄的','贪玩的','刻苦的','干净的','壮观的','和谐的','文静的','调皮的','害羞的','安详的','自信的','端庄的','坚定的','美满的','舒心的','温暖的','专注的','勤恳的','美丽的','腼腆的','优美的','甜美的','甜蜜的','整齐的','动人的','典雅的','尊敬的','舒服的','妩媚的','秀丽的','喜悦的','甜美的','彪壮的','强健的','大方的','俊秀的','聪慧的','迷人的','陶醉的','悦耳的','动听的','明亮的','结实的','魁梧的','标致的','清脆的','敏感的','光亮的','大气的','老迟到的','知性的','冷傲的','呆萌的','野性的','隐形的','笑点低的','微笑的','笨笨的','难过的','沉静的','火星上的','失眠的','安静的','纯情的','要减肥的','迷路的','烂漫的','哭泣的','贤惠的','苗条的','温婉的','发嗲的','会撒娇的','贪玩的','执着的','眯眯眼的','花痴的','想人陪的','眼睛大的','高贵的','傲娇的','心灵美的','爱撒娇的','细腻的','天真的','怕黑的','感性的','飘逸的','怕孤独的','忐忑的','高挑的','傻傻的','冷艳的','爱听歌的','还单身的','怕孤单的','懵懂的');

        $wei=array('嚓茶','凉面','便当','毛豆','花生','可乐','灯泡','哈密瓜','野狼','背包','眼神','缘分','雪碧','人生','牛排','蚂蚁','飞鸟','灰狼','斑马','汉堡','悟空','巨人','绿茶','自行车','保温杯','大碗','墨镜','魔镜','煎饼','月饼','月亮','星星','芝麻','啤酒','玫瑰','大叔','小伙','哈密瓜，数据线','太阳','树叶','芹菜','黄蜂','蜜粉','蜜蜂','信封','西装','外套','裙子','大象','猫咪','母鸡','路灯','蓝天','白云','星月','彩虹','微笑','摩托','板栗','高山','大地','大树','电灯胆','砖头','楼房','水池','鸡翅','蜻蜓','红牛','咖啡','机器猫','枕头','大船','诺言','钢笔','刺猬','天空','飞机','大炮','冬天','洋葱','春天','夏天','秋天','冬日','航空','毛衣','豌豆','黑米','玉米','眼睛','老鼠','白羊','帅哥','美女','季节','鲜花','服饰','裙子','白开水','秀发','大山','火车','汽车','歌曲','舞蹈','老师','导师','方盒','大米','麦片','水杯','水壶','手套','鞋子','自行车','鼠标','手机','电脑','书本','奇迹','身影','香烟','夕阳','台灯','宝贝','未来','皮带','钥匙','心锁','故事','花瓣','滑板','画笔','画板','学姐','店员','电源','饼干','宝马','过客','大白','时光','石头','钻石','河马','犀牛','西牛','绿草','抽屉','柜子','往事','寒风','路人','橘子','耳机','鸵鸟','朋友','苗条','铅笔','钢笔','硬币','热狗','大侠','御姐','萝莉','毛巾','期待','盼望','白昼','黑夜','大门','黑裤','钢铁侠','哑铃','板凳','枫叶','荷花','乌龟','仙人掌','衬衫','大神','草丛','早晨','心情','茉莉','流沙','蜗牛','战斗机','冥王星','猎豹','棒球','篮球','乐曲','电话','网络','世界','中心','鱼','鸡','狗','老虎','鸭子','雨','羽毛','翅膀','外套','火','丝袜','书包','钢笔','冷风','八宝粥','烤鸡','大雁','音响','招牌','胡萝卜','冰棍','帽子','菠萝','蛋挞','香水','泥猴桃','吐司','溪流','黄豆','樱桃','小鸽子','小蝴蝶','爆米花','花卷','小鸭子','小海豚','日记本','小熊猫','小懒猪','小懒虫','荔枝','镜子','曲奇','金针菇','小松鼠','小虾米','酒窝','紫菜','金鱼','柚子','果汁','百褶裙','项链','帆布鞋','火龙果','奇异果','煎蛋','唇彩','小土豆','高跟鞋','戒指','雪糕','睫毛','铃铛','手链','香氛','红酒','月光','酸奶','银耳汤','咖啡豆','小蜜蜂','小蚂蚁','蜡烛','棉花糖','向日葵','水蜜桃','小蝴蝶','小刺猬','小丸子','指甲油','康乃馨','糖豆','薯片','口红','超短裙','乌冬面','冰淇淋','棒棒糖','长颈鹿','豆芽','发箍','发卡','发夹','发带','铃铛','小馒头','小笼包','小甜瓜','冬瓜','香菇','小兔子','含羞草','短靴','睫毛膏','小蘑菇','跳跳糖','小白菜','草莓','柠檬','月饼','百合','纸鹤','小天鹅','云朵','芒果','面包','海燕','小猫咪','龙猫','唇膏','鞋垫','羊','黑猫','白猫','万宝路','金毛','山水','音响');

        $tou_num=rand(0,331);

        $wei_num=rand(0,325);

        $name=$tou[$tou_num].$wei[$wei_num];

        return $name; //输出生成的昵称
    }
}
?>
